package elementi.giocatori;

import audio.AudioPlayer;
import elementi.Elemento;
import elementi.ElementoMobile;
import elementi.Interattivo;
import gioco.Arena;
import gioco.GestoreElementi;
import grafica.GraficaProxy;

/**
 * Classe astratta che definisce l'elemento mobile giocatore
 * gestendo collisioni e le varie attività che può compiere giocatore
 * 
 */
public  abstract class Giocatore extends ElementoMobile {
	public static final int VITA_MAX = 5;
	public static final int ENERGIA_MAX = 1000;
	public static final int ENERGIA_DARDO_LENTO = 150;
	public static final int ENERGIA_DARDO_VELOCE = 300;
	public static final int RAGGIO_GIOCATORE = 10;
	public static final int ENERGIA_ABILITA = (int)((ENERGIA_MAX)*0.75);
	
	private int vita = VITA_MAX;
	private int energia = ENERGIA_MAX;
	private int incrementoEnergia = 3;
	private float seno,coseno;
	protected GestoreElementi GE = GestoreElementi.getGestoreElementi();
	
	private boolean scudo = false;


	public int getVita() {
		return vita;
	}
	
	/**
	 * metodo che toglie la vita al giocatore e 
	 * comunica algr gestore degl
	private final int VELOCITA_DARDO = 30;
	public static final int Di elementi l'eventuale morte
	 * @param ivelocitày
	 */
	public void togliVita(int i){
		if (scudo == false) {

			doTogliVita(i);
		} else {
			scudo= false;
		}
	}

	private void doTogliVita(int i) {
		if (i >= vita) {
			vita = 0;
			Arena.getArena().rimuoviElementoMobile(this);
		}
		else vita -= i;
	}

	
	
	public int getEnergia() {
		return energia;
	}
	
	public boolean sommaEnergia(int i) {
		if (i*(-1) > energia) return false;
		else {
			energia += i;
			if (energia > ENERGIA_MAX) energia = ENERGIA_MAX;
			return true;
		}
	}
	public void incrementaEnergia(){
		sommaEnergia(incrementoEnergia);
	}
	
	public float getSeno() {
		return seno;
	}
	public void setSeno(float seno) {
		this.seno = seno;
	}
	public float getCoseno() {
		return coseno;
	}
	public void setCoseno(float coseno) {
		this.coseno = coseno;
	}
	
	public void setScudo(boolean scudo) {
		this.scudo = scudo;	
	}
	
	public void setIncrementoEnergia(int incrementoEnergia) {
		this.incrementoEnergia = incrementoEnergia;
	}

	/**
	 * metodi che gestiscono una collisione orizzontale/verticale,
	 * sia con un esplosivo che con un altro elemento
	 */
	@Override
	public void notificaCollisione(Elemento e) {
		
		/* Brutta questa sequenza di if.
		 * Dal vosto gruppo mi aspetto un buon uso del Polimorfismo e sulle
		 * astrazioni che evitano queste catene di if/Dipendenze.
		 * E soprattutto: Giocatore non dovrebbe essere Dipendente da Esplosivo, Scudo , Energia etc.
		 * il Prof
		 */
		if(e instanceof Interattivo){
			Interattivo i = (Interattivo)e;
			i.eseguiInterazione(this);
		}
		else {
			setVelocitax(0);
			setVelocitay(0);
		}
	}
	
	
	public void sparaDardoLento(){
		if(sommaEnergia(-ENERGIA_DARDO_LENTO)&& vita>0){
			GE.istanziaDardoLento(getX(),getY(),seno,coseno);	
			//Questi suoni, un po' ovunque: sarebbe meglio usare una astrazione per poterli parametrizzare 
			AudioPlayer.suonaDardo();
		}
	}
	
	public void sparaDardoVeloce(){
		if(sommaEnergia(-ENERGIA_DARDO_VELOCE)&& vita>0){
			GE.istanziaDardoVeloce(getX(),getY(),seno,coseno);
			//Questi suoni, un po' ovunque: sarebbe meglio usare una astrazione per poterli parametrizzare
			AudioPlayer.suonaDardo();
		}
	}
	
	@Override
	public void disegnaElemento() {
		GraficaProxy.getSingleton().disegnaGiocatore(this);	
	}
	
	public abstract void usaAbilita();
}